package com.azt.api.service;

import java.util.List;
import java.util.Map;

import com.azt.api.dto.UserAuthority;
import com.azt.api.dto.UserExt;
import com.azt.api.dto.UserForEcharts;
import com.azt.api.dto.UserForMonthTip;
import com.azt.api.enums.UserEnum;
import com.azt.api.pojo.*;
import com.azt.exception.BaseException;
import com.azt.model.page.Pagination;
import org.apache.ibatis.annotations.Param;

public interface UserService  {

	/**
	 * 首页入驻企业数量
	 * */
    int getIndexUserCount();

    /**分页查询
	 * @param pageno
	 * @param searchMap  搜索参数map
	 * @return
	 */
	Pagination getUserPageBy(int pageno,int pagesize, Map<String, String> searchMap);

	/**
	 * 获取完整的用户信息（User对象中包含Company和Role信息）
	 * */
    User getFullUserById(int userId);

    /**根据用户id获取User
	 * @param userid
	 * @return
	 */
	User getUserById(Integer userid);


	/**
	 * 保存或者更新user信息
	 * @param user
	 */
	void saveOrUpdate(User user);


	/**
	 *重置密码
	 */
	void resetPassword(Integer userid, String password);

	/**
	 * 根据手机获取用户信息
	 * */
	User getUserByMobile(String mobile);

	/**
	 * 根据邮箱获取用户信息
	 * */
	User getUserByEmail(String email);

	/**
	 * 根据用户名(手机或邮箱)获取用户信息，不存在返回null
	 * */
	User getUserByUserName(String username);

	/**
	 * 注册用户（直接激活成功）<br>
	 * 创建user方法 公共<br>
	 * 捕获BaseException可以获取注册过程中的错误信息，如用户名已存在
	 * @param username 用户名（手机或邮箱）
	 * @param password 密码
	 * @param realName 姓名
	 * @param companyId 公司id（可为空）
	 * @param roleId 角色id
	 * */
    User registerNoAuth(String username, String password, String realName, Integer companyId, int roleId,String contactTel) throws BaseException;

    /**
	 * 验证用户名密码是否能登录
	 * */
	User verifyLogin(String username, String password) throws Exception;

	/**
	 * 检测用户名是否可以用来注册
	 * */
	User checkUserNameForRegister(String username) throws BaseException;


	/**
	 * 获取老的用户
	 * @author 张栋  2016年8月16日上午10:44:30
	 */
	OldUser getOldUserById(Integer userid);

	/**
	 * 发送忘记密码邮件
	 * @param email 邮箱
	 * @param authString u_user表中authString
	 * */
	void sendIforgotMail(String email, String authString);

	/**
	 * 生成找回密码邮件链接code
	 * */
	String createIforgotMailCode(String email, String pwdString);

	/**
	 * 发送激活邮箱
	 * */
	void sendActiveMail(String email, String authString);

	/**
	 * 生成激活邮箱链接code
	 * */
	String createActiveMailCode(String email, String authString);

    /**
     * 根据id删除(软删除)
     * */
    void deleteById(Integer id);

    /**
     * 启用/禁用
     * */
    void toggleUserDisabledById(Integer userid);

	/**
	 * 插入用户申请企业记录
	 * @param uac
	 */
    void insertUserApplyCompany(UserApplyCompany uac);

	/**
	 * 根据条件获取加入企业申请
	 * @param userId
	 * @param auditState
	 * @return
	 */
    List<UserApplyCompany> findUserApplyCompanyByUserId(int userId, Integer auditState);

	/**
	 * 获取待审核的加入企业申请
	 * @param userId
	 * @return
	 */
	UserApplyCompany getAuditingApplyCompany(int userId);


	/** 
	 * @Title: getUserByAdminRole 
	 * @Description: 查到管理员的user  公共方法
	 * @param companyId
	 * @param ifAdminRole
	 * @return
	 * @return: List<User>
	 * @author: 查恒 2016年10月9日 下午3:37:33 
	 */
	List<User> getUserByAdminRole(Integer companyId, List<Role> ifAdminRole);
	
	
	/**
	 * 根据公司id和roleType查询员工
	 * @Title: getFrontUserPageByCid 
	 * @Description: TODO
	 * @param pageno
	 * @param pagesize
	 * @param searchMap
	 * @return
	 * @return: Pagination
	 * @author: zhoudongdong 2016年10月12日 上午11:01:52
	 */
	Pagination getFrontUserPageByCid(int pageno,int pagesize, Map<String, String> params);
	
	/**
	 * 根据公司id和state查询申请员工数量
	 * @Title: queryApplyUserCount 
	 * @Description: TODO
	 * @param companyId
	 * @param state
	 * @return
	 * @return: Integer
	 * @author: zhoudongdong 2016年10月12日 下午1:45:03
	 */
	Integer queryApplyUserCount(String companyId,String state);
	
	/**
	 * 解绑员工（删除）
	 * @Title: unbindUserFromCompany 
	 * @Description: TODO
	 * @param userid
	 * @return: void
	 * @author: zhoudongdong 2016年10月12日 下午2:08:07
	 */
	void unbindUserFromCompany(String userid);
	
	/**
	 * 查询公司的当前role绑定角色数量
	 * @Title: queryRoleByCompanyId 
	 * @Description: TODO
	 * @param companyId
	 * @return
	 * @return: Integer
	 * @author: zhoudongdong 2016年10月12日 下午2:31:20
	 */
	int queryRoleByCompanyId(String companyId,String roleType);
	
	/**
	 * 根据登录名查询员工
	 * @Title: queryUserByCompanyId 
	 * @Description: TODO
	 * @param companyId
	 * @return
	 * @return: User
	 * @author: zhoudongdong 2016年10月12日 下午3:02:07
	 */
	User queryUserBylogin(String login);

    List<Role> findRoleByCompanyId(Company company, int roleType);

    /**
	 * 根据当前管理员角色和公司id查询角色列表
	 * @Title: getRolesByCompanyId 
	 * @Description: TODO
	 * @param companyId
	 * @param roleType
	 * @return
	 * @return: List<Role>
	 * @author: zhoudongdong 2016年10月21日 下午4:25:12
	 */
	List<Role> getRolesByCompanyId(Integer companyId, Integer roleType);
	
	/**
	 * 添加员工
	 * @Title: addEmployee 
	 * @Description: TODO
	 * @param user
	 * @return: void
	 * @author: zhoudongdong 2016年10月21日 下午4:25:51
	 */
	void addEmployee(User user,Company company,int roleId,String roleCode);
	
	/**
	 * 添加游离员工
	 * @Title: addNoCompanyEmployee 
	 * @Description: TODO
	 * @param user
	 * @param company
	 * @param roleId
	 * @return: void
	 * @author: zhoudongdong 2016年10月26日 下午2:20:38
	 */
	void addNoCompanyEmployee(User user,Company company,int roleId);
	
	/**
	 * 修改员工
	 * @Title: updateEmpoyee 
	 * @Description: TODO
	 * @return: void
	 * @author: zhoudongdong 2016年10月28日 下午2:07:32
	 */
	void updateEmpoyee(User u,int originRoleid,Company company,String roleCode);
	
	/**
	 * 获取公司申请员工
	 * @Title: getApplyEmployee 
	 * @Description: TODO
	 * @param pageno
	 * @param pagesize
	 * @param companyId
	 * @param roleType
	 * @return
	 * @return: Pagination
	 * @author: zhoudongdong 2016年10月28日 下午4:29:39
	 */
	Pagination getApplyEmployee(int pageno,int pagesize, String companyId,String roleType);

	/** 
	 * @Title: getUsersByUserRoles 
	 * @Description: 返回User
	 * @param userRoles
	 * @return: void
	 * @author: 查恒 2016年10月27日 上午10:54:33 
	 */
	List<User> getUsersByUserRoles(List<UserRole> userRoles);
	
	/**
	 * 根据userid查询用户申请对象
	 * @Title: getUserApplyCompanyByUid 
	 * @Description: TODO
	 * @param uid
	 * @return
	 * @return: UserApplyCompany
	 * @author: zhoudongdong 2016年10月31日 下午1:22:43
	 */
	UserApplyCompany getUserApplyCompanyByUid(Integer uid);
	
	/**
	 * 同意员工申请
	 * @Title: agreeUserApply 
	 * @Description: TODO
	 * @param u
	 * @return: void
	 * @author: zhoudongdong 2016年10月31日 下午4:11:33
	 */
	void agreeUserApply(UserApplyCompany u);
	
	/**
	 * 拒绝员工申请
	 * @Title: refuseUserApply 
	 * @Description: TODO
	 * @param u
	 * @return: void
	 * @author: zhoudongdong 2016年11月1日 下午2:30:09
	 */
	void refuseUserApply(UserApplyCompany u);

	/** 
	 * @Title: getUserInfo 
	 * @Description: 获取用户的基础数据
	 * @param company
	 * @param currentRole
	 * @return
	 * @return: Map
	 * @author: 查恒 2016年11月21日 下午5:25:41 
	 */
	Map getUserInfo(Company company, Role currentRole,User currentuser);
	
	/** 
	 * @Title: getUserAccountByUserId 
	 * @Description: 查询用户的积分接口
	 * @param userId
	 * @return
	 * @return: UserAccount
	 * @author: 查恒 2016年11月22日 下午4:13:58 
	 */
	public UserAccount getUserAccountByUserId(Integer userId);
	
	
	
	
	/** 
	 * @Title: getUserAuthorityByCompanyId 
	 * @Description: 根据公司ID取对应权限
	 * @param companyId
	 * @param userenum
	 * @return
	 * @return: List<UserAuthority>
	 * @author: 查恒 2016年11月25日 上午10:51:14 
	 */
	public List<UserAuthority> getUserAuthorityByCompanyId(Integer companyId,List<UserEnum> userenum);
	
	/** 
	 * @Title: getUserAuthorityByUserId 
	 * @Description: 用户是否有这个权限菜单
	 * @param userId
	 * @param userenum
	 * @return
	 * @return: boolean
	 * @author: 查恒 2016年12月2日 上午10:46:29 
	 */
	public boolean getUserAuthorityByUserId(Integer userId,List<UserEnum> userenum);

	/** 
	 * @Title: getUserApplyCompanyByRoleId 
	 * @Description: 查询申请状态的角色
	 * @param id
	 * @param roleId
	 * @param auditState
	 * @return
	 * @return: List<UserApplyCompany>
	 * @author: 查恒 2016年12月2日 上午10:46:19 
	 */
	List<UserApplyCompany> getUserApplyCompanyByRoleId(Integer id, Integer roleId,Integer auditState);
	
	/**
	 * 根据用户id和roleid修改角色
	 * @Title: changeRoleByUserId 
	 * @Description: TODO
	 * @return: void
	 * @author: zhoudongdong 2016年12月13日 上午11:05:17
	 */
	public void changeRoleByUserId(Integer userId,Integer roleId,Integer orRoleId);
	
	/**
	 * 禁用启用某用户
	 * @Title: forbiddenUser 
	 * @Description: TODO
	 * @param userId
	 * @return: void
	 * @author: zhoudongdong 2016年12月13日 下午1:28:23
	 */
	public void forbiddenUser(Integer userId ,Integer state);

	/**
	 * 统计分析, 每月新增
	 * Created by 张栋 on 2016/12/16 10:47
	 */
    List<UserForEcharts> echartsAdded();
	
	/**
	 *新增认的
	 * Created by 张栋 on 2016/12/16 10:47
	 */
	List<UserForEcharts> echartsAddedAuth();



	/**
	 * 根据报价id获取发布询价的用户
	 * @param quoteId
	 * @return
	 */
	public User getUserByQuoteId(Integer quoteId);

    List<LoginLog> findLoginLogByUserId(int userId);

	public LoginLog getLoginLog(String sessionId, int userId);

    void insertLoginLog(LoginLog loginLog);

	void updateLoginLog(LoginLog loginLog);


	/**
	 * 查所有领导,根据code.查出所有用户id ,用来发短信
	 * pleader,供应商    cleader采购
	 * Created by 张栋 on 2016/12/28 10:24
	 */
	List<UserExt>  getAllLeaderIds(String code);



	/**
	 * 晒用户的统计信息,   每月通知给领导
	 * Created by 张栋 on 2016/12/28 14:00
	 */
	UserForMonthTip getUserForMonthTip(@Param("userid") Integer userid, @Param("code") String code, Integer year, Integer month);

	/**
	 * 根据公司id 查该公司的员工
	 * Created by 张栋 on 2016/12/28 14:32
	 */
	List<User> getUsersBYCompanyId(Integer companyId);
	
	
	/** 
	 * @Title: getUserByIngralRule 
	 * @Description: 从积分记录表中取记录时间之前的所有和积分有关的用户
	 * @param lastYear 上一年
	 * @return: List<User>
	 * @author: 查恒 2017年2月23日 下午1:49:07 
	 */
	public List<User> getUserByIngralRecord(String recordTime);

    List<Map> statisticsUser(Map param);

    List<Map> statisticsUserDetail(Map param);
}

